#pragma once
#include <iostream>
using namespace std;
class date{
  public: 
    //构造函数
    date(int year=2023,int month=1,int day=1)
    {
      cout<<"构造函数"<<endl;
      _day=day;
      _year=year;
      _month=month;
    }
    //拷贝构造和析构函数在日期类中没有必要写
    //<运算符的重载
    bool operator<(const date& d)
    {
      return _day<d._day&&
             _month<d._month&&
             _year<d._year;
    }
    //>=运算符的重载
    bool operator>=(const date& d)
    {
      return !(*this<d);
    }
    bool operator>(const date& d)
    {
      return _day>d._day&&
             _month>d._month&&
             _year>d._year;
    }
    bool operator<=(const date& d)
    {
      return !(*this>d);
    }
    //注：这里不需要写赋值运算符的重载，因为这里默认生成的赋值运算符的重载是浅拷贝，也就是值拷贝，所以刚好符合我们的需求
    // 获取某年某月的天数
    int GetMonthDay(int year, int month)
    {
      static int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
      if((year%400==0)||
         ((year%4==0&&
          year%100!=0)&&
         month==2))
        return 29;
      return day[month];
    }
    //+运算符的重载
    date operator+(int day)
    {
      date ret=*this;
      ret._day+=day;
      while(ret._day>GetMonthDay(ret._year,ret._month))
      {
        if(ret._month>12)
        {
          ret._year++;
          ret._month-=12;
        }
       
        ret._day-=GetMonthDay(ret._year,ret._month);
        ret._month++;
      }
      return ret;
    }
    //+=运算符的重载
    date& operator+=(int day)
    {
      _day+=day;
      while(_day>GetMonthDay(_year,_month))
      {
        if(_month>12)
        {
          _year++;
          _month-=12;
        }
       
        _day-=GetMonthDay(_year,_month);
        _month++;
      }
      return *this;
    }
    //-运算符的重载
    date& operator-=(int day)
    {
      _day-=day;
      while(_day<=0)
      { 
        _month--;
         
        if(_month<=0)
        {
          _year--;
          _month+=12;
        }  
        _day+=GetMonthDay(_year,_month); 
      }
      return *this;
    }
    //-运算符的重载
    date operator-(int day)
    {
      date ret=*this;
      ret-=day;
      return ret;
    }
    //前置++运算符重载
    date& operator++()
    {
      _day+=1;
      if(_day>GetMonthDay(_year,_month))
      {
         _month++;
         _day=_day-GetMonthDay(_year,_month);
      }  
      if(_month>12)
      {
        _year++;
        _month=1;
      }
      return *this;
    }
    //后置++运算符的重载
    date operator++(int)
    {
      date ret(*this);
      ++(*this);
      return ret;
    }
    //前置--运算符的重载
    date& operator--()
    {
      _day--;
      if(_day<=0)
      {
        _month--;
        _day+=GetMonthDay(_year,_month);
      }
      if(_month<=0)
      {
        _year--;
        _month+=12;
      }
      return *this;
    }
    //后置--运算符的重载
    date operator--(int)
    {
      date ret(*this);
      --(*this);
      return ret;
    }
    //日期打印函数
    void print()
    {
      cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
    }
  private:
    int _day;
    int _month;
    int _year;
};





